﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using QuanLyChoVayCaNhan.Models;
using QuanLyChoVayCaNhan.Classes;
using System.Text.RegularExpressions;
using System.Globalization;

namespace QuanLyChoVayCaNhan.Forms
{
    public partial class AddKhachHang : Form
    {
        private KhachHang data = null;
        public AddKhachHang(MenuItemType type)
        {
            switch (type)
            {
                case MenuItemType.ADD:
                    InitializeComponent();
                    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                    this.MaximizeBox = false;
                    this.MinimizeBox = false;
                    this.data = new KhachHang();
                    this.data.MaKH = "KH" + (ModelManager.GetInstance().db.KhachHangs.Count() + 1);
                    this.button1.Text = "Lưu";
                    this.button2.Text = "Hủy";
                    this.button1.Click += btnLuuThemMoi_Click;
                    this.button2.Click += btnHuyThemMoi_Click;
                    this.Text = "Thêm khách hàng";
                    this.xungHoComboBox.DataSource = ModelManager.GetInstance().db.GetXungHo().ToList();
                    break;
                case MenuItemType.VIEW:
                    InitializeComponent();
                    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                    this.MaximizeBox = false;
                    this.MinimizeBox = false;
                    this.data = ModelManager.GetInstance().db.KhachHangs.ToList().ElementAt(WindowsManager.GetInstance().TabKhachHang.SelectedIndex);
                    this.maKHTextBox.ReadOnly = this.tenKHTextBox.ReadOnly = this.diaChiTextBox.ReadOnly = this.soCMNDTextBox.ReadOnly = this.noiCapCMNDTextBox.ReadOnly = this.dTDDTextBox.ReadOnly = this.dTNhaTextBox.ReadOnly = this.emailTextBox.ReadOnly = true;
                    this.xungHoComboBox.Enabled = this.ngayCapCMNDDateTimePicker.Enabled = false;
                    this.btnChonChuKy.Enabled = false;
                    this.button1.Text = "Sửa";
                    this.button2.Text = "Hủy";
                    this.button1.Click += btnLuuXem_Click;
                    this.button2.Click += btnHuyXem_Click;
                    this.Text = "Xem thông tin";
                    if (!UserManager.GetInstance().IsAdmin() && !UserManager.GetInstance().IsCBQHKH())
                    {
                        this.button1.Enabled = false;
                        this.button1.Visible = false;
                    }
                    break;
                case MenuItemType.EDIT:
                    InitializeComponent();
                    this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
                    this.MaximizeBox = false;
                    this.MinimizeBox = false;
                    this.data = ModelManager.GetInstance().db.KhachHangs.ToList().ElementAt(WindowsManager.GetInstance().TabKhachHang.SelectedIndex);
                    this.maKHTextBox.ReadOnly = true;
                    this.button1.Text = "Lưu";
                    this.button2.Text = "Hủy";
                    this.Text = "Sửa thông tin";
                    this.button1.Click += btnLuuSua_Click;
                    this.button2.Click += btnHuySua_Click;
                    this.xungHoComboBox.DataSource = ModelManager.GetInstance().db.GetXungHo().ToList();
                    break;
            }
        }

        // them moi
        private void btnHuyThemMoi_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnLuuThemMoi_Click(object sender, EventArgs e)
        {
            if (maKHTextBox.Text == null || maKHTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập mã khách hàng");
                return;
            }
            if (tenKHTextBox.Text == null || tenKHTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập tên khách hàng");
                return;
            }
            if (diaChiTextBox.Text == null || diaChiTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập địa chỉ");
                return;
            }
            if (soCMNDTextBox.Text == null || soCMNDTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập số CMND");
                return;
            }
            if (this.data.NgayCapCMND == null || data.NgayCapCMND.Year < 1900)
            {
                MessageBox.Show("Bạn chưa chọn ngày cấp CMND");
                return;
            }
            if (this.noiCapCMNDTextBox.Text == null || this.noiCapCMNDTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập nơi cấp CMND");
                return;
            }
            if (emailTextBox.Text != null && emailTextBox.Text.Length > 0 && !this.IsValidEmail(emailTextBox.Text))
            {
                MessageBox.Show("Email bạn nhập chưa đúng");
                return;
            }
            this.data.Created = this.data.Modified = DateTime.Now;
            ModelManager.GetInstance().db.KhachHangs.Add(this.data);
            ModelManager.GetInstance().db.SaveChanges();
            this.Close();
        }
        // xem
        private void btnHuyXem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnLuuXem_Click(object sender, EventArgs e)
        {
            // click sửa khi xem thông tin
            this.tenKHTextBox.ReadOnly = this.diaChiTextBox.ReadOnly = this.soCMNDTextBox.ReadOnly = this.noiCapCMNDTextBox.ReadOnly = this.dTDDTextBox.ReadOnly = this.dTNhaTextBox.ReadOnly = this.emailTextBox.ReadOnly = false;
            this.xungHoComboBox.Enabled = this.ngayCapCMNDDateTimePicker.Enabled = true;
            this.btnChonChuKy.Enabled = true;
            this.button1.Text = "Lưu";
            this.button1.Click -= btnLuuXem_Click;
            this.button1.Click += btnLuuSua_Click;
            this.Text = "Sửa thông tin";
            this.xungHoComboBox.DataSource = ModelManager.GetInstance().db.GetXungHo().ToList();
        }
        // sua
        private void btnHuySua_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnLuuSua_Click(object sender, EventArgs e)
        {
            if (tenKHTextBox.Text == null || tenKHTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập tên khách hàng");
                return;
            }
            if (diaChiTextBox.Text == null || diaChiTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập địa chỉ");
                return;
            }
            if (soCMNDTextBox.Text == null || soCMNDTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập số CMND");
                return;
            }
            if (this.data.NgayCapCMND == null || data.NgayCapCMND.Year < 1900)
            {
                MessageBox.Show("Bạn chưa chọn ngày cấp CMND");
                return;
            }
            if (this.noiCapCMNDTextBox.Text == null || this.noiCapCMNDTextBox.Text.Length == 0)
            {
                MessageBox.Show("Bạn chưa nhập nơi cấp CMND");
                return;
            }
            if (emailTextBox.Text != null && emailTextBox.Text.Length > 0 && !this.IsValidEmail(emailTextBox.Text))
            {
                MessageBox.Show("Email bạn nhập chưa đúng");
                return;
            }
            KhachHang kh = ModelManager.GetInstance().db.KhachHangs.FirstOrDefault<KhachHang>(x => x.MaKH == this.maKHTextBox.Text);
            kh.TenKH = this.tenKHTextBox.Text;
            kh.XungHo = this.data.XungHo;
            kh.DiaChi = this.diaChiTextBox.Text;
            kh.SoCMND = this.soCMNDTextBox.Text;
            kh.NgayCapCMND = this.data.NgayCapCMND;
            kh.NoiCapCMND = this.noiCapCMNDTextBox.Text;
            kh.DTDD = this.dTDDTextBox.Text;
            kh.DTNha = this.dTNhaTextBox.Text;
            kh.Email = this.emailTextBox.Text;
            kh.Modified = DateTime.Now;
            ModelManager.GetInstance().db.SaveChanges();
            this.Close();
        }

        // check email
        bool invalid = false;

        public bool IsValidEmail(string strIn)
        {
            invalid = false;
            if (String.IsNullOrEmpty(strIn))
                return false;

            // Use IdnMapping class to convert Unicode domain names. 
            try
            {
                strIn = Regex.Replace(strIn, @"(@)(.+)$", this.DomainMapper,
                                      RegexOptions.None, TimeSpan.FromMilliseconds(200));
            }
            catch (RegexMatchTimeoutException)
            {
                return false;
            }

            if (invalid)
                return false;

            // Return true if strIn is in valid e-mail format. 
            try
            {
                return Regex.IsMatch(strIn,
                      @"^(?("")(""[^""]+?""@)|(([0-9a-z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-z])@))" +
                      @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-z][-\w]*[0-9a-z]*\.)+[a-z0-9]{2,24}))$",
                      RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
            }
            catch (RegexMatchTimeoutException)
            {
                return false;
            }
        }

        private string DomainMapper(Match match)
        {
            // IdnMapping class with default property values.
            IdnMapping idn = new IdnMapping();

            string domainName = match.Groups[2].Value;
            try
            {
                domainName = idn.GetAscii(domainName);
            }
            catch (ArgumentException)
            {
                invalid = true;
            }
            return match.Groups[1].Value + domainName;
        }

        private void AddKhachHang_Load(object sender, EventArgs e)
        {
            this.khachHangBindingSource.DataSource = this.data;
        }

        private void btnChonChuKy_Click(object sender, EventArgs e)
        {
            if (openFileImageDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                data.ChuKy = openFileImageDialog.FileName;
                this.chuKyPictureBox.ImageLocation = openFileImageDialog.FileName;
            }
        }

        private void xungHoLabel_Click(object sender, EventArgs e)
        {

        }

        private void diaChiLabel_Click(object sender, EventArgs e)
        {

        }

        private void soCMNDLabel_Click(object sender, EventArgs e)
        {

        }

        private void dTDDLabel_Click(object sender, EventArgs e)
        {

        }

        private void maKHLabel_Click(object sender, EventArgs e)
        {

        }

        private void chuKyLabel_Click(object sender, EventArgs e)
        {

        }

        private void ngayCapCMNDLabel_Click(object sender, EventArgs e)
        {

        }

        private void dTNhaLabel_Click(object sender, EventArgs e)
        {

        }

        private void tenKHLabel_Click(object sender, EventArgs e)
        {

        }

        private void noiCapCMNDLabel_Click(object sender, EventArgs e)
        {

        }

        private void emailLabel_Click(object sender, EventArgs e)
        {

        }
    }
}
